package com.yhf.config;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.crypto.password.PasswordEncoder;

@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    @Autowired
    private PasswordEncoder passwordEncoder;

    @Autowired
    private UserDetailsService myUserDetailService;

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.csrf().disable();//关闭security管理所有请求
        http.formLogin()
        //指定登录页
        .loginPage("/login.html")
        //登录的请求URL
        .loginProcessingUrl("/user/login")
        //如果直接访问登录页，未指定目标资源，登录成功后去的目标资源
        .defaultSuccessUrl("/success")
        //   .usernameParameter("name")
        //   .passwordParameter("password")   name不是username或password
        //指定页面用户名的name属性和密码的name属性，默认就是username和password
        //.usernameParameter().passwordParameter()
        //放行
        .permitAll();


        http.authorizeRequests()
        //具备 javaee 或者 xiaoban 这个角色才能访问 /student/** 的资源。
        .antMatchers("/add")
        .hasAnyRole("xiaoban", "javaee");  //在这个API中会自动帮我们加上 ROLE_ 前缀
        //如果没有对应的角色，就无法访问到目标资源，会报 403 【权限不足】


//        http.authorizeRequests()
//                //具备 student_update 权限 才能/student/update 的资源。
//                .antMatchers("/student/update")
//                .hasAuthority("student_update");

        //处理403权限不足
        http.exceptionHandling().accessDeniedPage("/403.html");

//        //8.登出
//        http.logout()
//                //退出url
//                .logoutUrl("/user/logout")
//                //退出后去哪
//                .logoutSuccessUrl("/login.html")
//                //杀死session
//                .invalidateHttpSession(true)
//                //删除cookie
//                .deleteCookies("JSESSIONID");






        //3.拦截规则【一定要指定】
        http.authorizeRequests()
                //任意请求
                .anyRequest()
                //认证通过
                .authenticated();


    }

    /**
     * 认证配置方法
     */
    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        //1.指定认证过程是哪个认证类完成
        //2.指定加密器
        auth.userDetailsService(myUserDetailService).passwordEncoder(passwordEncoder);
    }
}
